/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.cco;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.cco.exception.CentroComercialException;
import co.gov.medellin.sdep.sisdep.cco.exception.CentroComercialRuntimeException;
import co.gov.medellin.sdep.sisdep.cco.service.ICentroComercialService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.gestion.dto.VisitaAdministrativaDTO;
import co.gov.medellin.sdep.sisdep.gestion.exception.VisitaAdministrativaException;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.CentroComercial;
import co.gov.medellin.sdep.sisdep.model.VisitaAdministrativa;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;

/**
 * @author Usuario
 * 
 */
public class CentroComercialController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/** bean para el manejo del formulario de busqueda CentroComercial */
	private CentroComercial centroComercialSearch = new CentroComercial();

	/** Objeto contenedor del listado de CentroComercial luego de una consulta. */
	private transient DataModel centroComercialListModel;

	/** bean para el manejo del formulario de creacion/edicion. CentroComercial */
	private CentroComercial centroComercial = new CentroComercial();
	
	private CentroComercial centroComercialReport;

	/** instancia de servicio centroComercialService */
	private ICentroComercialService centroComercialService;

	LocalCentroComercialController localCentroComercialController;

	/** Coleccion que contiene un unico elemento y que sera usada en la construccion del archivo PDF. */
	private Collection reportCollection ;
	
	private transient DataModel numeroLocalesCentroComercialListModel;
	
	private transient DataModel numeroLocalesDispCentroComercialListModel;
	
	private transient DataModel localesPersonaCentroComercialListModel;
	
	private transient DataModel localesDispCentroComercialListModel;
	
	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public CentroComercialController() {
		this.centroComercialListModel = new ListDataModel();
	}
	
	/** instancia un objeto de direccion local, en caso que el usuario no valide direccion al menos una vez */
	private BeanDireccion direccionLocal = new BeanDireccion();
	
	
	private GeoUbicacionClient geoUbicacionClient;
	
	
	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 */
	public String searchCentroComercialByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getCentroComercialService().load(1, 10,
					this.centroComercialSearch);
			this.centroComercialListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.centroComercialListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.centroComercialListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}		
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		
		centroComercialSearch.setNombre("");		
		
		return AppConstants.CENTRO_COMERCIAL_SEARCH_VIEW;
	}
	

	/**
	 * 
	 * @return String
	 */
	public String searchCentroComercialByNombre() {
		String msg = "";
		try {
			List valores = null;
			valores = getCentroComercialService().loadByNombre(1, 10,
					this.centroComercialSearch);
			this.centroComercialListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.centroComercialListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.centroComercialListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		
		centroComercialSearch.setNombre("");
		
		return AppConstants.CENTRO_COMERCIAL_SEARCH_VIEW;
	}

  /**
	 * Metodo que permite espeficicar la funcionalidad para la gestion [Crear / Actualizar] de un elmento tipo:
	 * CentroComercial.
	 *     
	 * @author programador.java@consult-soft.com  05-06-2012
	 * @return String Vista a la cual debe retornar
	 * 	 
	 */
	public String manage() {
		String returnView = AppConstants.CENTRO_COMERCIAL_SEARCH_VIEW;
		if(this.centroComercial.getId() == null) {
       returnView = create();
		} else {
       returnView = update();
		}
		return returnView;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.centroComercial.getId() == null) {
				getCentroComercialService().insert(this.centroComercial);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (CentroComercialException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (CentroComercialRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("- centroComercial " + msg, null, null);
		return AppConstants.CENTRO_COMERCIAL_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.centroComercial.getId() != null) {
				getCentroComercialService().update(this.centroComercial);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (CentroComercialException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (CentroComercialRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("- Valor Tipo Maestra " + msg, null, null);
		return AppConstants.CENTRO_COMERCIAL_SEARCH_VIEW;
	}

	public List listaCentrosComerciales() throws CentroComercialException{
		List lstCentrosComerciales = null;
		try{
		lstCentrosComerciales = getCentroComercialService().listaCentrosComerciales();
		} catch (CentroComercialException e) {
			e.printStackTrace(System.err);
		}
		return lstCentrosComerciales;
		
	}	
	
    public void generateXlsReportNumLocalesPorCCO() {
    	    	
    		try {
    			List valores = null;
    			numeroLocalesCentroComercialListModel = new ListDataModel();
    			valores = this.getCentroComercialService().generateXlsReportNumLocalesPorCCO();	
    			this.numeroLocalesCentroComercialListModel.setWrappedData(valores);    			    			
			} catch (CentroComercialException e) {
				e.printStackTrace(System.err);
				
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
					.setErrorMessage(AppConstants.DEFAULT_ERROR + e.getEndUserMessage(), null, null);
			}
    	
    	
    	this.centroComercialReport =  new CentroComercial();
    			
    }	
    
    public void generateXlsReportNumLocalesDisponiblesPorCCO() {
    	
		try {
			List valores = null;
			numeroLocalesDispCentroComercialListModel = new ListDataModel();
			valores = this.getCentroComercialService().generateXlsReportNumLocalesDisponiblesPorCCO();	
			this.numeroLocalesDispCentroComercialListModel.setWrappedData(valores);    			    			
		} catch (CentroComercialException e) {
			e.printStackTrace(System.err);
			
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setErrorMessage(AppConstants.DEFAULT_ERROR + e.getEndUserMessage(), null, null);
		}
	
	
	this.centroComercialReport =  new CentroComercial();
		
    }
    
    public void generateXlsReportLocalesPersonaPorCCO() {
    	
		try {
			List valores = null;
			localesPersonaCentroComercialListModel = new ListDataModel();
			valores = this.getCentroComercialService().generateXlsReportLocalesPersonaPorCCO();	
			this.localesPersonaCentroComercialListModel.setWrappedData(valores);    			    			
		} catch (CentroComercialException e) {
			e.printStackTrace(System.err);
			
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setErrorMessage(AppConstants.DEFAULT_ERROR + e.getEndUserMessage(), null, null);
		}	
		this.centroComercialReport =  new CentroComercial();			
	 }    
    
    public void generateXlsReportLocalesDisponiblesPorCCO() {
    	
		try {
			List valores = null;
			localesDispCentroComercialListModel = new ListDataModel();
			valores = this.getCentroComercialService().generateXlsReportLocalesDisponiblesPorCCO();	
			this.localesDispCentroComercialListModel.setWrappedData(valores);    			    			
		} catch (CentroComercialException e) {
			e.printStackTrace(System.err);
			
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setErrorMessage(AppConstants.DEFAULT_ERROR + e.getEndUserMessage(), null, null);
		}
	
	
	this.centroComercialReport =  new CentroComercial();
		
    }    
	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createCentroComercial() {
		centroComercial = new CentroComercial();
		centroComercial.setId(null);
		centroComercial.setUsuarioCrea(getLoggedUserID());
		centroComercial.setUsuarioModifica(getLoggedUserID());
		//centroComercial.setEstado("ACTIVO");
		return AppConstants.CENTRO_COMERCIAL_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateCentroComercial() {
		Map params = getExternalContext().getRequestParameterMap();
		String centroComercialDataIndex = (String) params
				.get("centroComercialDataIndex");
		this.centroComercial = (CentroComercial) ((List) this.centroComercialListModel
				.getWrappedData())
				.get(Integer.parseInt(centroComercialDataIndex));
		return AppConstants.CENTRO_COMERCIAL_UPDATE_VIEW;
	}
	
	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(this.centroComercial.getDireccion());
		if(null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		centroComercial.setCodBarrio(OracleHelper.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
		centroComercial.setBarrio(OracleHelper.isNullorEmpty(direccionLocal.getValueNomBarrio()) ? "NO Disponible" : direccionLocal.getValueNomBarrio());
		centroComercial.setCodComuna(OracleHelper.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
		centroComercial.setComuna(OracleHelper.isNullorEmpty(direccionLocal.getValueNomComuna()) ? "NO Disponible" : direccionLocal.getValueNomComuna());

		return "";
	}

	/**
	 * 
	 * @return
	 */
	public String localesCentroComercial() {
		Map params = getExternalContext().getRequestParameterMap();
		String centroComercialDataIndex = (String) params
				.get("centroComercialDataIndex");
		this.centroComercial = (CentroComercial) ((List) this.centroComercialListModel
				.getWrappedData())
				.get(Integer.parseInt(centroComercialDataIndex));
		
		getLocalCentroComercialController().localCentroComercialSearch.setIdCentroComercialStr(centroComercial.getId().toString());
		getLocalCentroComercialController().searchLocalCentroComercialByIdCCo();
		return AppConstants.LOCAL_CENTRO_COMERCIAL_SEARCH_VIEW;
	}
	
	
	/**
	 * 
	 * @return
	 */
	public String cancelCentroComercial() {
		return AppConstants.CENTRO_COMERCIAL_SEARCH_VIEW;
	}

	
	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public CentroComercial getCentroComercialSearch() {
		return centroComercialSearch;
	}

	/**
	 * 
	 * @param centroComercialSearch
	 */
	public void setcentroComercialSearch(CentroComercial centroComercialSearch) {
		this.centroComercialSearch = centroComercialSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getcentroComercialListModel() {
		return centroComercialListModel;
	}

	/**
	 * 
	 * @param centroComercialListModel
	 */
	public void setcentroComercialListModel(DataModel centroComercialListModel) {
		this.centroComercialListModel = centroComercialListModel;
	}

	/**
	 * 
	 * @return
	 */
	public CentroComercial getCentroComercial() {
		return centroComercial;
	}

	/**
	 * 
	 * @param centroComercial
	 */
	public void setcentroComercial(CentroComercial centroComercial) {
		this.centroComercial = centroComercial;
	}

	/**
	 * obtencion del servicio centroComercialService
	 * 
	 * @return
	 */
	public ICentroComercialService getCentroComercialService() {
		return centroComercialService;
	}

	/**
	 * establecimiento del servicio centroComercialService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param centroComercialService
	 */
	public void setCentroComercialService(
			ICentroComercialService centroComercialService) {
		this.centroComercialService = centroComercialService;
	}

	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	public void setGeoUbicacionClient(GeoUbicacionClient geoUbicacionClient) {
		this.geoUbicacionClient = geoUbicacionClient;
	}


	public LocalCentroComercialController getLocalCentroComercialController() {
		return localCentroComercialController;
	}


	public void setLocalCentroComercialController(
			LocalCentroComercialController localCentroComercialController) {
		this.localCentroComercialController = localCentroComercialController;
	}


	public CentroComercial getCentroComercialReport() {
		return centroComercialReport;
	}


	public void setCentroComercialReport(CentroComercial centroComercialReport) {
		this.centroComercialReport = centroComercialReport;
	}


	public Collection getReportCollection() {
		return reportCollection;
	}


	public void setReportCollection(Collection reportCollection) {
		this.reportCollection = reportCollection;
	}


	public DataModel getCentroComercialListModel() {
		return centroComercialListModel;
	}


	public void setCentroComercialListModel(DataModel centroComercialListModel) {
		this.centroComercialListModel = centroComercialListModel;
	}


	public DataModel getNumeroLocalesCentroComercialListModel() {
		return numeroLocalesCentroComercialListModel;
	}


	public void setNumeroLocalesCentroComercialListModel(
			DataModel numeroLocalesCentroComercialListModel) {
		this.numeroLocalesCentroComercialListModel = numeroLocalesCentroComercialListModel;
	}


	public DataModel getNumeroLocalesDispCentroComercialListModel() {
		return numeroLocalesDispCentroComercialListModel;
	}


	public void setNumeroLocalesDispCentroComercialListModel(
			DataModel numeroLocalesDispCentroComercialListModel) {
		this.numeroLocalesDispCentroComercialListModel = numeroLocalesDispCentroComercialListModel;
	}


	public DataModel getLocalesPersonaCentroComercialListModel() {
		return localesPersonaCentroComercialListModel;
	}


	public void setLocalesPersonaCentroComercialListModel(
			DataModel localesPersonaCentroComercialListModel) {
		this.localesPersonaCentroComercialListModel = localesPersonaCentroComercialListModel;
	}


	public DataModel getLocalesDispCentroComercialListModel() {
		return localesDispCentroComercialListModel;
	}


	public void setLocalesDispCentroComercialListModel(
			DataModel localesDispCentroComercialListModel) {
		this.localesDispCentroComercialListModel = localesDispCentroComercialListModel;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
